/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package model;

import controller.HistorialVueloController;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;

/**
 *
 * @author Enrique
 */
public class SimulacionTracking {
    
    private List<Nodo> listaNodos = new ArrayList<Nodo>();
    private List<Arista> listaAristas = new ArrayList<Arista>();
    private Set fechasVuelos = new HashSet(0);
    private Date fechaInicioSim;
    private Date fechaActualSim;
    private float minutos_sim = 0;
    private Paquete paquete;
    
    
    // CONSTRUCTORES
    public SimulacionTracking() {
    }
    
    
    // SETTERS Y GETTERS        

    public Paquete getPaquete() {
        return paquete;
    }

    public void setPaquete(Paquete paquete) {
        this.paquete = paquete;
    }    
    
    public List<Nodo> getListaNodos() {
        return listaNodos;
    }

    public void setListaNodos(List<Nodo> listaNodos) {
        this.listaNodos = listaNodos;
    }

    public List<Arista> getListaAristas() {
        return listaAristas;
    }

    public void setListaAristas(List<Arista> listaAristas) {
        this.listaAristas = listaAristas;
    }

    public Set getFechasVuelos() {
        return fechasVuelos;
    }

    public void setFechasVuelos(Set fechasVuelos) {
        this.fechasVuelos = fechasVuelos;
    }

    public Date getFechaInicioSim() {
        return fechaInicioSim;
    }

    public void setFechaInicioSim(Date fechaInicioSim) {
        this.fechaInicioSim = fechaInicioSim;
    }

    public Date getFechaActualSim() {
        return fechaActualSim;
    }

    public void setFechaActualSim(Date fechaActualSim) {
        this.fechaActualSim = fechaActualSim;
    }

    public float getMinutos_sim() {
        return minutos_sim;
    }

    public void setMinutos_sim(float minutos_sim) {
        this.minutos_sim = minutos_sim;
    }

    
    
    // METODOS
    
    public void iniciarSimulacion(Paquete paquete){
        
        this.paquete = paquete;
        
        //seteo fechas de la simulacion
        Calendar cal = Calendar.getInstance();
        cal.set(Calendar.MINUTE,0);
        cal.set(Calendar.SECOND,0);
        cal.set(Calendar.MILLISECOND,0);
        this.fechaInicioSim=cal.getTime();
        this.fechaActualSim=cal.getTime();
        
        //cargo estructuras de datos
        Carga.rellenarListaNodosDesdeBD(this);
        Carga.rellenarListaAristasDesdeBD(this);
        Carga.rellenarListaAristasVecinas(this);
        Carga.inicializarEstructuras(this);
                
        // obtengo historiales de vuelo del paquete
//        List<HistorialVuelo> listaVuelos = HistorialVueloController.buscarHistorialesXPaquete(this.paquete);
        fechasVuelos = paquete.getHistorialVuelos();
        
        // agrego el paquete a sus historiales de vuelo correspondientes, dentro de la lista de aristas
        this.agregarPaqueteAHistoriaelsVuelos();
        
    }

    public void aumentarTiempo() {
        
        //aumento el tiempo
        this.fechaActualSim = new Date(this.fechaActualSim.getTime()+((int)(Math.round(minutos_sim)))*60*1000);
        
        //reviso llegada de vuelos
        Revision.revisarLLegadaDeVuelos(this);
        
        // reviso partida de vuelos
        Revision.revisarPartidaDeVuelos(this);
        
    }

    private void agregarPaqueteAHistoriaelsVuelos() {
        Iterator<HistorialVuelo> iterador = this.fechasVuelos.iterator();
        while(iterador.hasNext()){  // para cada uno de los historiales de vuelo del paquete
            HistorialVuelo historialVuelo = iterador.next();
            for (int i=0; i<this.listaAristas.size(); i++){  // para cada uno de los vuelos
               Vuelo vueloActual = this.listaAristas.get(i).getVuelo();
               Iterator<HistorialVuelo> iterador2 = vueloActual.getHistorialVuelos().iterator();
               while(iterador2.hasNext()){  // para cada uno de los historiales del vuelo actual
                   HistorialVuelo temp = iterador2.next();
                   if (temp.getId().getIdVuelo() == historialVuelo.getId().getIdVuelo() // si este historial es igual al del paquete
                           && temp.getId().getFecha().compareTo(historialVuelo.getId().getFecha()) == 0){
                       temp.getPaquetes().add(this.paquete);    // agrego el paquete a ese historial
                       System.out.println("agregue paquete a " + temp.getId().getIdVuelo());
                   }
               }
            }
        }
    }
    
    
}
